home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 3 / Gekikoh Dennoh Club Vol. 3 (Japan).7z / Gekikoh Dennoh Club Vol. 3 (Japan) (Track 1).bin / tools / jftp / src.lzh / RECV.HAS < prev    next >
Text File  |  1997-12-10  |  3KB  |  113 lines

  1. *----------------------------------------------------------
  2. *
  3. *    Joystick port transfer function
  4. *
  5. *    Copyright 1995 MAKOPi
  6. *
  7. *----------------------------------------------------------
  8.  
  9. PUSH    .macro    REG_LIST
  10.     movem.l    REG_LIST,-(sp)
  11.     .endm
  12.  
  13. POP    .macro    REG_LIST
  14.     movem.l    (sp)+,REG_LIST
  15.     .endm
  16.  
  17. ***********************************************************
  18.  
  19. PPIA    .equ    $E9A001
  20. PPIB    .equ    $E9A003
  21. PPIC    .equ    $E9A005
  22. PPICW    .equ    $E9A007
  23.  
  24. *PC4_HI    .equ    $9
  25. *PC4_LOW    .equ    $8
  26.  
  27. ***********************************************************
  28.     .include DOSCALL.EQU
  29.  
  30.     .text
  31.     .even
  32.  
  33. *----------------------------------------------------------
  34. *
  35. * int joy_recv( unsigned char *buf, int len );
  36. *
  37. * 引数
  38. *  buf        : 受信データバッファへのポインタ
  39. *  len        : 受信データ個数(バイト単位)
  40. *
  41. * 戻り値
  42. *  d0.l >= 0    : 正常終了(d0:チェックsum)
  43. *
  44. *----------------------------------------------------------
  45.     .globl _joy_recv
  46. _joy_recv:
  47.     move.l    4(sp),d0    * d0 = 受信データバッファへのポインタ
  48.     move.l    8(sp),d1    * d1 = 受信データ個数
  49.  
  50.     PUSH    d2-d7/a2-a4
  51.  
  52.     move.l    d0,a4        * a4 = 受信データバッファへのポインタ
  53.     move.l    d1,d4        * d4 = 受信データ個数
  54. **    subq.l    #1,d4        * d4 = 受信データ個数 - 1(dbraを使う時)
  55. *****    move.l    #PPIA,a2    * (a2) = PPIA
  56.     move.l    _uport,a2    * (a2) = PPIA
  57.     move.l    #PPICW,a3    * (a3) = PPICW
  58.     moveq.l    #4,d5        * d5 = 4bitシフト用(定数)
  59.     moveq.l    #$0F,d6        * d6 = 下位4bitマスク用(定数)
  60.     move.b    #%1100_0000,d7    * d7 = PA6チェック用(定数)
  61.  
  62.     clr.l    a1        * スーパーバイザーモード
  63.     IOCS    __B_SUPER
  64.     move.l    d0,d3        * d3 = SSP
  65.     ori.w    #$0700,sr
  66.  
  67.     moveq.l    #0,d1
  68.     moveq.l    #0,d2        * d2.l = チェックSUM初期化
  69.  
  70. *    moveq.l    #PC4_HI,d0    * PC4 -> HI
  71.     move.l    _cport,d0    * PC4 -> HI
  72.     add.l    d0,d0
  73.     addq.l    #1,d0
  74.     move.b    d0,(a3)
  75.  
  76. recvdata:
  77. @@:    move.b    (a2),d0        *[8]     PPIA 読み込み
  78.     cmp.b    d7,d0        *[4]    
  79.     bcc    @b        *[10?]    
  80.     lsl.b    d5,d0        *[12]     d0 = 上位ニブル
  81.  
  82. @@:    move.b    (a2),d1        *[8]     PPIA 読み込み
  83.     cmp.b    d7,d1        *[4]    
  84.     bcs    @b        *[10?]    
  85.     and.b    d6,d1        *[4]     d1 = 下位ニブル
  86.  
  87.     or.b    d0,d1        *[4]     d1 = 受信1バイト
  88.     move.b    d1,(a4)+    *[8]     1バイト書き込み
  89.  
  90.     add.l    d1,d2        *[8]     d2.l = d2.l + d1.l
  91.  
  92. *    dbra    d4,recvdata    *     指定回数(d4)受信する
  93.     subq.l    #1,d4        *[8]     d4 = d4 - 1
  94.     bne    recvdata    *[10]    
  95.  
  96.     move.l    _cport,d0    * PC?
  97.     add.l    d0,d0
  98.     move.b    d0,(a3)        * PC4 -> LOW
  99.  
  100.     andi.w    #$f8ff,sr
  101.     cmpi.l    #-1,d3        * もともとsuperviserだった?
  102.     beq    @f
  103.     move.l    d3,a1        * ユーザーモード
  104.     IOCS    __B_SUPER
  105. *    clr.l    d0
  106. @@:
  107.     move.l    d2,d0        * d0.l = 戻り値 = チェックsum
  108.  
  109.     POP    d2-d7/a2-a4
  110.     rts
  111.  
  112.     .end
  113.